package com.gshg.log.cleanlog.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

@Slf4j
public class DateUtil {


    /**
     * 获取传入时间的前some天或者后some天；如果传入参数为空，返回当前时间的前some天或者后some天
     * @param paramDate
     * @param some   为正数时返回后some天；为负数时，返回后some天
     *               例如：传入时间为2019-12-04 10:00:00；some值为-3，返回为2019-12-01 10：00：00
     *                     传入时间为2019-12-04 10:00:00；some值为3，返回为2019-12-07 10：00：00
     * @return 传入时间的前some天或者后some天；如果传入参数为空，返回当前时间的前some天或者后some天
     */
    public static Date getDateBeforeSomeDate(Date paramDate, int some){

        if(null == paramDate){
            paramDate=new Date();
        }

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(paramDate);
        calendar.add(Calendar.DAY_OF_MONTH, some);
//        calendar.add(Calendar.YEAR, some);//当前时间减去一年，即一年前的时间
//        calendar.add(Calendar.MONTH, -1);//当前时间前去一个月，即一个月前的时间
//        calendar.getTime();//获取一年前的时间，或者一个月前的时间
        return calendar.getTime();
    }



    /**
     * 获取传入时间的前some月或者后some月；如果传入参数为空，返回当前时间的前some月或者后some月
     * @param paramDate
     * @param some   为正数时返回后some月；为负数时，返回后some月
     *               例如：传入时间为2019-12-04 10:00:00；some值为-3，返回为2019-09-04 10：00：00
     *                     传入时间为2019-12-04 10:00:00；some值为3，返回为2020-03-04 10：00：00
     * @return 传入时间的前some月或者后some月；如果传入参数为空，返回当前时间的前some月或者后some月
     */
    public static Date getDateBeforeSomeMonth(Date paramDate, int some){

        if(null == paramDate){
            paramDate=new Date();
        }

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(paramDate);
//        calendar.add(Calendar.YEAR, some);//当前时间减去一年，即一年前的时间
        calendar.add(Calendar.MONTH, some);//当前时间前去一个月，即一个月前的时间
        return calendar.getTime();
    }

    /**
     * 获取传入时间的前some年或者后some年；如果传入参数为空，返回当前时间的前some年或者后some年
     * @param paramDate
     * @param some   为正数时返回后some年；为负数时，返回后some年
     *               例如：传入时间为2019-12-04 10:00:00；some值为-3，返回为2016-12-04 10:00:00
     *                     传入时间为2019-12-04 10:00:00；some值为3，返回为2022-12-04 10:00:00
     * @return 传入时间的前some年或者后some年；如果传入参数为空，返回当前时间的前some年或者后some年
     */
    public static Date getDateBeforeSomeYear(Date paramDate, int some){

        if(null == paramDate){
            paramDate=new Date();
        }

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(paramDate);
        calendar.add(Calendar.YEAR, some);//当前时间减去一年，即一年前的时间
        return calendar.getTime();
    }

    /**
     * 将日期时间格式化为字符串
     * 传入日期时间为空时，取当前时间
     * 传入日期时间转为字符串格式（formatStr）为空时，取默认值：yyyy-MM-dd HH:mm:ss
     * @param formatStr  日期时间转为字符串格式；例如：yyyy-MM-dd HH:mm:ss  yyyyMMddHHmmss yyyy-MM-dd等
     *                   formatStr为空时，取默认值：yyyy-MM-dd HH:mm:ss
     * @param date   传入的时间
     *               date为空时取当前日期时间
     * @return
     */
    public static String dateFormatString(String formatStr, Date date){
        if(null == date){
            date = new Date();
        }
        if(StringUtils.isEmpty(formatStr)){
            formatStr="yyyy-MM-dd HH:mm:ss";
        }
        SimpleDateFormat format = new SimpleDateFormat(formatStr);
        return format.format(date);
    }

    /**
     * 将日期时间格式的字符串转换为日期时间
     * @param dateStr     待转换的日期时间格式字符串
     * @param formatStr   转换格式
     * @return
     */
    public static Date stringParseDate(String dateStr, String formatStr){

        if(StringUtils.isEmpty(dateStr)){
            return null;
        }

        if(StringUtils.isEmpty(formatStr)){
            formatStr="yyyy-MM-dd HH:mm:ss";
        }
        Date date = null;
        try {
            SimpleDateFormat format = new SimpleDateFormat(formatStr);
            date = format.parse(dateStr);

        }catch (Exception e){
            log.error(e.getLocalizedMessage(), e);
        }

        return date;
    }
}
